#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 输入相应的ID号，将其合并为一行
#   默认输入311,456，并提取档位

# 使用方法
#   psc_merge.py REC000030.txt
#   
# from psc_merge import *
# rec_merge(filename, ['0000311', '00000456'], 
#                       [])

import sys

I_DATA=22   # 数据所在偏移量
I_NEXTDATA=31   # 下一段数据所在偏移量

def default_convert_func(l):
    """
     @brief default_convert_func 默认处理函数
     @param l 当前行的文本
    """
    ret = l[I_DATA:].rstrip()
    return ret

def rec_merge(filename, id_list, idc_list=None):
    """
     @brief rec_merge 本文件通过轮询每一行的记录，并筛选出对应的日志后，按照日志的处理函数返回一定的字符串；
            根据输入的ID列表，程序还维护一个循环，判断循环到头后，进行相应的填充
     @param filename 日志的文件名
     @param id_list 待处理的ID关键字
     @param idc_list ID对应的处理函数
    """
    length = len(id_list)
    flags = ['0']*length
    cell = ['---']*length
    time = '00000000'
    with open(filename) as f:
        for l in f:
            for i in range(length):
                sid = id_list[i]
                if sid in l:
                    flags[i] = '1'
                    try:
                        cvt = idc_list[i]
                    except:
                        cvt = default_convert_func

                    cell[i] = cvt(l)
                    time = l[6:12]
                    if i == length - 1:
                        # 打印本次数据是否有效
                        print(time, '\t'.join(flags), '\t'.join(cell), sep='\t')
                        flags = ['0']*length

level_cmd={
        "02": "N停车",
        "01": "D停车",
        "03": "R停车",
        "05": "D牵引",
        "06": "N牵引",
        "07": "R牵引",
        "09": "D制动",
        "0A": "N制动",
        "0B": "R制动",
        "0F": "E紧急",
        }

def cmd_handler(l):
    cmd = l[I_DATA:I_DATA+2]    # 控车方向命令
    level = l[I_DATA+2:I_DATA+4]    # 控车油门深度
    lifecnt = l[I_NEXTDATA+4:I_NEXTDATA+6]  # 生命周期
    try:
        # 
        cmd_str = level_cmd[cmd]
    except:
        cmd_str = "E异常"
    # 分别为 命令、命令字符串、油门、生命周期
    return "%d\t%s\t%d\t%d"%(int(cmd, 16), cmd_str, int(level, 16), int(lifecnt, 16))

def v_handler(l):
    v = int(l[I_NEXTDATA:I_NEXTDATA+2],16)*256 + int(l[I_DATA+6:I_DATA+8], 16)
    tract = l[I_DATA+2:I_DATA+4]
    lifecnt = l[I_NEXTDATA+4:I_NEXTDATA+6]  # 生命周期
    # 分别为 转速、速度km/h、反馈油门、生命周期
    return "%d\t%.2f\t%d\t%d"%(v, (v-11000)*0.008, int(tract, 16), int(lifecnt, 16))

if __name__ == "__main__":
    if len(sys.argv) > 2:
        rec_merge(sys.argv[1], sys.argv[2:])
    else:
        # 此处表示，00000311关键字对应的解析函数是cmd_handler，000456对应解析函数是v_handler
        rec_merge(sys.argv[1], ['00000311', '00000456'], 
                [
                    cmd_handler,
                    v_handler
                ]
                )
